#include "mainwindow.h"
#include "ui_mainwindow.h"

#include <QSize>

MainWindow::~MainWindow(){
    delete ui;
    // 析构子类对象，使用对象树去析构，不用手动析构
    // if(_login_dlg != nullptr){
    //     delete _login_dlg;
    //     _login_dlg = nullptr;
    // }
    // if(_register_dlg != nullptr){
    //     delete _register_dlg;
    //     _register_dlg = nullptr;
    // }
}

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    // ui->statusbar->setVisible(false); // 把底行的状态栏去掉

    // 初始化 LoginDialog *_login_dlg 并设置为MainWindow的中心部件
    _login_dlg = new LoginDialog();
    _login_dlg->setWindowFlags(Qt::CustomizeWindowHint | Qt::FramelessWindowHint);
    setCentralWidget(_login_dlg);
    // _login_dlg->show();

    // register_btn的clicked信号 ---> LoginDialog的switchRegister信号 ---> MainWindow的slotSwitchRegister槽函数
    connect(_login_dlg, &LoginDialog::switchRegister, this, &MainWindow::slotSwitchRegister);

    // LoginDialog 界面忘记密码向 MainWindow 发射的信号
    connect(_login_dlg, &LoginDialog::switchReset, this, &MainWindow::slotSwitchReset);

    // LoginDialog 发送 SigSwitchChat 信号请求切换到聊天界面
    connect(_login_dlg, &LoginDialog::SigSwitchChat, this, &MainWindow::slotSwitchChat);
    // slotSwitchChat(); // debug: 直接显示 ChatDialog 界面，正在测试 ChatDialog 界面
}

// 登陆界面切换到聊天界面
void MainWindow::slotSwitchChat(){
    qDebug() << "MainWindow: 聊天界面已打开"; // debug

    // 可见 LoginDialog, RegisterDialog, ResetDialog, ChatDialog 只有 LoginDialog 界面是在 MainWindow 构造函数中创建的
    // 因为有些界面可能会用不到，就像单例中的懒汉模式和饿汉模式的区别
    _chat_dlg = new ChatDialog();
    _chat_dlg->setWindowFlags(Qt::CustomizeWindowHint | Qt::FramelessWindowHint);
    setCentralWidget(_chat_dlg);
    // 设置 _chat_dlg 显示，_login_dlg 隐藏
    _chat_dlg->show();
    _login_dlg->hide();
    this->setMinimumSize(QSize(1050, 900));
    this->setMaximumSize(QWIDGETSIZE_MAX, QWIDGETSIZE_MAX);
}

// 登陆界面切换到注册界面
void MainWindow::slotSwitchRegister(){
    _register_dlg = new RegisterDialog();
    // 使 _login_dlg 和 _register_dlg 作为MainWindow的子类，不用手动去析构_login_dlg和_register_dlg等，造成的内存泄露
    _register_dlg->setWindowFlags(Qt::CustomizeWindowHint | Qt::FramelessWindowHint);

    //连接注册界面返回登录信号
    connect(_register_dlg, &RegisterDialog::sigSwitchLogin, this, &MainWindow::slotSwitchLogin);

    setCentralWidget(_register_dlg);
    _login_dlg->hide();
    _register_dlg->show();
}
// 注册界面切换到登陆界面
void MainWindow::slotSwitchLogin(){
    //创建一个CentralWidget, 并将其设置为MainWindow的中心部件
    _login_dlg = new LoginDialog(this);
    _login_dlg->setWindowFlags(Qt::CustomizeWindowHint | Qt::FramelessWindowHint);

    // 接登录界面忘记密码信号
    connect(_login_dlg, &LoginDialog::switchReset, this, &MainWindow::slotSwitchReset);
    //连接登录界面注册信号
    connect(_login_dlg, &LoginDialog::switchRegister, this, &MainWindow::slotSwitchRegister);

    setCentralWidget(_login_dlg);
    _register_dlg->hide();
    _login_dlg->show();
}

// 登陆界面切换到重置密码界面
void MainWindow::slotSwitchReset(){
    // 创建一个 ResetDialog 界面，并设置为 MainWindow 的中心部件
    _reset_dlg = new ResetDialog(this);
    _reset_dlg->setWindowFlags(Qt::CustomizeWindowHint | Qt::FramelessWindowHint);
    setCentralWidget(_reset_dlg);

    _login_dlg->hide();
    _reset_dlg->show();
    // 注册返回登陆信号和槽函数
    connect(_reset_dlg, &ResetDialog::switchLogin, this, &MainWindow::slotSwitchLogin2);
}
// 从重置界面返回登录界面
void MainWindow::slotSwitchLogin2(){
    // 创建一个CentralWidget, 并将其设置为MainWindow的中心部件
    _login_dlg = new LoginDialog(this);
    _login_dlg->setWindowFlags(Qt::CustomizeWindowHint|Qt::FramelessWindowHint);
    setCentralWidget(_login_dlg);

    _reset_dlg->hide();
    _login_dlg->show();
    // 接登录界面忘记密码信号
    connect(_login_dlg, &LoginDialog::switchReset, this, &MainWindow::slotSwitchReset);
    // 连接登录界面注册信号
    connect(_login_dlg, &LoginDialog::switchRegister, this, &MainWindow::slotSwitchRegister);
}
